﻿using TgcViewer;
using TgcViewer.Utils.TgcGeometry;
using TgcViewer.Utils.TgcKeyFrameLoader;
using Microsoft.DirectX;
using Microsoft.DirectX.Direct3D;

namespace AlumnoEjemplos.zanellaSports
{
    public class Modelo
    {
        private TgcKeyFrameMesh cuadro;
        private TgcKeyFrameMesh orquilla;
        private TgcKeyFrameMesh ruedaD;
        private TgcKeyFrameMesh ruedaT;
        //Lista de animaciones disponibles
        public const string RUN = "run";
        public const string TURN_LEFT = "turnLeft";
        public const string TURN_RIGHT = "turnRight";
       // const string WILLY = "willy";

        public string lastAnim;

        public Modelo()
        {
            //Carpeta de archivos Media del alumno
            string alumnoMediaFolder = GuiController.Instance.AlumnoEjemplosMediaDir + "zanellaSports\\";
            //Path para carpeta de texturas de la malla de la Zanella
            string mediaPathZanella = alumnoMediaFolder + "zanella\\";
            //Extencion de los exports
            string extFrameMesh = "-TgcKeyFrameMesh.xml";
            string extFrameAnim = "-TgcKeyFrameAnim.xml";

            string[] animationList = new string[]{
                RUN,
                TURN_LEFT,
                TURN_RIGHT,
               // WILLY,
            };

            //Crear rutas con cada animacion
            string[] animationsPath = new string[animationList.Length];
            TgcKeyFrameLoader loader = new TgcKeyFrameLoader();

            //Cargo las animaciones para el cuadro de la moto
            for (int i = 0; i < animationList.Length; i++)
            {
                animationsPath[i] = mediaPathZanella + animationList[i] +"C"+ extFrameAnim;
            }
            //Cargar mesh y animaciones
            cuadro = loader.loadMeshAndAnimationsFromFile(mediaPathZanella + "cuadro" + extFrameMesh, mediaPathZanella, animationsPath);
           
            //Cargo las animaciones para la orquilla de la moto
            for (int i = 0; i < animationList.Length; i++)
            {
                animationsPath[i] = mediaPathZanella + animationList[i] + "O" + extFrameAnim;
            }
            //Cargar mesh y animaciones
            orquilla = loader.loadMeshAndAnimationsFromFile(mediaPathZanella + "orquilla" + extFrameMesh, mediaPathZanella, animationsPath);
            
            //Cargo las animaciones para la rueda delantera de la moto
            for (int i = 0; i < animationList.Length; i++)
            {
                animationsPath[i] = mediaPathZanella + animationList[i] + "RD" + extFrameAnim;
            }
            //Cargar mesh y animaciones
            ruedaD = loader.loadMeshAndAnimationsFromFile(mediaPathZanella + "ruedaDelantera" + extFrameMesh, mediaPathZanella, animationsPath);
            
            //Cargo las animaciones para el cuadro de la moto
            for (int i = 0; i < animationList.Length; i++)
            {
                animationsPath[i] = mediaPathZanella + animationList[i] + "RT" + extFrameAnim;
            }
            //Cargar mesh y animaciones
            ruedaT = loader.loadMeshAndAnimationsFromFile(mediaPathZanella + "ruedaTrasera" + extFrameMesh, mediaPathZanella, animationsPath);

            //Configurar animacion inicial
            cuadro.playAnimation(animationList[0], true);
            orquilla.playAnimation(animationList[0], true);
            ruedaD.playAnimation(animationList[0], true);
            ruedaT.playAnimation(animationList[0], true);
            //Escalarlo porque es muy grande
            cuadro.Position = orquilla.Position = ruedaD.Position = ruedaT.Position = new Vector3(0, 0, 0);
            cuadro.Scale = orquilla.Scale = ruedaD.Scale = ruedaT.Scale = new Vector3(0.07f, 0.07f, 0.07f);
            //Rotarlo 180° porque esta mirando para el otro lado
            cuadro.rotateY(Geometry.DegreeToRadian(180f));
            orquilla.rotateY(Geometry.DegreeToRadian(180f));
            ruedaD.rotateY(Geometry.DegreeToRadian(180f));
            ruedaT.rotateY(Geometry.DegreeToRadian(180f));
        }

        /// <summary>
        /// Metodo el cual se encarga de realizar el render del vehiculo
        /// </summary>
        public void render(float elapsedTime)
        {
            cuadro.animateAndRender();
            orquilla.animateAndRender();
            ruedaD.animateAndRender();
            ruedaT.animateAndRender();
        }

        public void rotateY(float angle)
        {
            cuadro.rotateY(angle);
            orquilla.rotateY(angle);
            ruedaD.rotateY(angle);
            ruedaT.rotateY(angle);
            
        }
        public void move(Vector3 desplazamiento)
        {
            cuadro.move(desplazamiento.X, desplazamiento.Y, desplazamiento.Z);
            orquilla.move(desplazamiento.X, desplazamiento.Y, desplazamiento.Z);
            ruedaD.move(desplazamiento.X, desplazamiento.Y, desplazamiento.Z);
            ruedaT.move(desplazamiento.X, desplazamiento.Y, desplazamiento.Z);
        }

        public void move(float x, float y, float z)
        {
            cuadro.move(x,y,z);
            orquilla.move(x,y,z);
            ruedaD.move(x,y,z);
            ruedaT.move(x, y, z);
        }

        public Vector3 rotation(){
            return cuadro.Rotation;
        }
        public Vector3 Position()
        {
            return cuadro.Position;
        }

        public void dispose()
        {
            cuadro.dispose();
            orquilla.dispose();
            ruedaD.dispose();
            ruedaT.dispose();
        }

        public void setAnim(string anim)
        {
            if (anim != lastAnim)
            {
                cuadro.playAnimation(anim, false);
                orquilla.playAnimation(anim, false);
                ruedaD.playAnimation(anim, false);
                ruedaT.playAnimation(anim, false);
                lastAnim = anim;
            }
        }

        public void turnLeft()
        {
            this.setAnim(TURN_LEFT);
        }
        public void turnRight()
        {
            this.setAnim(TURN_RIGHT);
        }
        public void run()
        {
            this.setAnim(RUN);
        }
    }
}